/**
 * @author        Nicolas Bottarini <nicolasbottarini@gmail.com>, 404 <http://www.proyecto404.com>
 * @version       $Rev: 3 $
 * @lastrevision  $Date: 2011-09-12 16:45:37 +0000 (Mon, 12 Sep 2011) $	 
 */
package com.proyecto404.core.mvc.bootstrapperTasks {
	import com.proyecto404.core.AssetInfo;
	import com.proyecto404.core.AssetInfoTypes;
	import com.proyecto404.core.Configuration;
	import com.proyecto404.core.EventArgs;
	import com.proyecto404.core.collections.IIterator;
	import com.proyecto404.core.collections.Set;
	import com.proyecto404.core.configuration.PreloaderInfo;
	import com.proyecto404.core.exception.InvalidOperationException;
	import com.proyecto404.core.exception.InvalidPreloaderClassException;
	import com.proyecto404.core.io.DisplayObjectLoadedEventArgs;
	import com.proyecto404.core.io.DisplayObjectLoader;
	import com.proyecto404.core.mvc.Application;
	import com.proyecto404.core.mvc.Library;
	import com.proyecto404.core.mvc.Preloader;
	import com.proyecto404.core.mvc.PreloaderLoadedEventArgs;
	import com.proyecto404.core.mvc.PreloaderLoader;
	import com.proyecto404.core.mvc.PreloaderView;
	import com.proyecto404.core.mvc.ViewInfo;
	import com.proyecto404.core.util.ClassHelper;
	import com.proyecto404.core.util.FileHelper;
	import com.proyecto404.core.util.StringHelper;
	
	import flash.events.Event;
	
	public class RunPreloaderTask extends BaseBootstrapperTask {
		private var _preloaderLoader:PreloaderLoader;
		
		public function RunPreloaderTask(application:Application) {
			super(application);
		}

		private function loadPreloader():void {
			if (!application.configuration.hasConfiguration("preloaders: main")) {
				throw new InvalidOperationException("Debe definir un preloader con el nombre main");
			}
			_preloaderLoader = new PreloaderLoader(application);
			_preloaderLoader.loaded.add(onLoaded);
			_preloaderLoader.loadError.add (function(e:EventArgs):void {
				throw new InvalidOperationException("No se ha podido cargar el archivo del preloader main");
			});
			_preloaderLoader.load("main");
		}
		
		private function onLoaded(e:PreloaderLoadedEventArgs):void {
			application.rootDisplayObject.addChild(e.preloaderView);
			e.preloaderView.closed.add(function(ev:EventArgs):void {
				application.rootDisplayObject.removeChild(e.preloaderView);
				notifyTaskCompletion();
			});
			e.preloaderView.open();
		}
		
		public override function execute(): void {
			loadPreloader();
		}
	}
}